package com.whmall.service.crm.api;

import com.whmall.component.entity.dto.CompanyUserQuotationInvervalDTO;
import com.whmall.component.entity.dto.OperatorReqDTO;
import com.whmall.component.service.ChainQueryService;
import com.whmall.component.service.QueryService;
import com.whmall.component.service.SaveService;
import com.whmall.service.crm.entity.dto.company.CompanySyncAddReqDTO;
import com.whmall.service.crm.entity.dto.companyuser.*;

import java.util.List;
import java.util.Map;

/**
 * 公司用户API
 *
 * @author alex
 * @since 2020/7/31
 */
public interface CompanyUserApi extends QueryService, ChainQueryService<CompanyUserQueryCondition>, SaveService {

    /**
     * 创建公司用户
     *
     * @param requesterId 请求者员工ID
     * @param companyId   公司ID
     * @param request     创建请求
     * @return 返回新创建用户的唯一ID
     */
    Long createCompanyUser(Long requesterId, Long companyId, CreateOrUpdateCompanyUserReqDTO request);

    /**
     * 同步创建公司用户信息（直接赋值 无校验）
     * @param reqDTO
     * @param companyId
     * @param operator
     * @return
     */
    CompanyUserSyncAddRspDTO syncCreateCompanyUser(CompanyUserSyncAddReqDTO reqDTO,Long companyId,OperatorReqDTO operator);

    /**
     * 批量同步创建公司用户信息（直接赋值 无校验）
     * @param userList
     * @param companyList
     * @param operator
     * @return
     */
    Map<String,CompanyUserSyncAddRspDTO> batchSyncCreateUser(List<CompanyUserSyncAddReqDTO> userList,
                                                             List<CompanySyncAddReqDTO> companyList,
                                                             OperatorReqDTO operator);


    /**
     * 更新公司用户
     *
     * @param requesterId   请求者员工ID
     * @param companyId     公司ID
     * @param companyUserId 公司用户ID
     * @param request       更新请求
     */
    void updateCompanyUser(Long requesterId, Long companyId, Long companyUserId, CreateOrUpdateCompanyUserReqDTO request);

    /**
     * 更新用户邮箱通知
     *
     * @param notifyList
     * @param userId
     */
    void updateEmailNotify(Long userId, List<Integer> notifyList, OperatorReqDTO operatorReqDTO);

    /**
     * 采购锁定
     *
     * @param requesterId   请求员工ID
     * @param companyId     公司ID
     * @param companyUserId 公司用户ID
     * @param lockReason    锁定原因
     */
    void lockBuy(Long requesterId, Long companyId, Long companyUserId, String lockReason);

    /**
     * 取消采购锁定
     *
     * @param requesterId   请求员工ID
     * @param companyId     公司ID
     * @param companyUserId 公司员工ID
     */
    void unlockBuy(Long requesterId, Long companyId, Long companyUserId);

    /**
     * 销售锁定
     *
     * @param requesterId   请求员工ID
     * @param companyId     公司ID
     * @param companyUserId 公司用户ID
     * @param lockReason    锁定原因
     */
    void lockSale(Long requesterId, Long companyId, Long companyUserId, String lockReason);

    /**
     * 取消采购锁定
     *
     * @param requesterId   请求员工ID
     * @param companyId     公司ID
     * @param companyUserId 公司员工ID
     */
    void unlockSale(Long requesterId, Long companyId, Long companyUserId);

    /**
     * 设置默认用户/取消默认用户
     *
     * @param requesterId   请求员工ID
     * @param companyId     公司ID
     * @param companyUserId 公司员工ID
     */
    void setDefaultUser(Long requesterId, Long companyId, Long companyUserId);

    /**
     * 获取公司用户详细信息
     *
     * @param companyId     公司ID
     * @param companyUserId 公司用户ID
     * @return 找到返回对应的公司用户详细信息，否则将返回null
     */
    CompanyUserDetailsRspDTO getDetailsById(Long companyId, Long companyUserId);

    /**
     * 根据公司ID查找用户列表
     *
     * @param companyId 公司ID
     * @return 公司用户列表
     */
    List<CompanyUserListItemRspDTO> listUserByCompany(Long companyId);

    /**
     * 根据公司ID查找有效用户列表（通用）
     *
     * @param companyId 公司ID
     * @return 公司用户列表
     */
    List<CompanyUserKeyFieldRspDTO> getAvailableCompanyUsers(Long companyId);

    /**
     * 根据用户账号（手机号和邮箱）模糊查询用户
     *
     * @param username
     * @param rule     匹配规则，1-匹配手机，2-匹配邮箱，null-匹配手机和邮箱
     * @param limitNum 限制数据量，null表示不限制
     * @return
     */
    List<CompanyUserListByUsernameRspDTO> listByUsername(String username, Integer rule, Integer limitNum);

    /**
     * 通过用户ID查询（通用）
     *
     * @param id 用户ID
     * @return
     */
    CompanyUserKeyFieldRspDTO findById(Long id);

    /**
     * 根据用户ID集合查询用户（通用）
     *
     * @param ids
     * @return
     */
    Map<Long, CompanyUserKeyFieldRspDTO> listByIds(List<Long> ids);

    /**
     * 根据用户ID集合查询用户（通用）
     *
     * @param reqDTO
     * @return
     */
    Map<Long, CompanyUserKeyFieldRspDTO> listByIds(CompanyUserQueryReqDTO reqDTO);

    /**
     * 通过1个唯一性字段查询用户（通用）
     *
     * @param reqDTO
     * @return
     */
    Map<String, CompanyUserKeyFieldRspDTO> queryByOneField(CompanyUserQueryByOneFieldReqDTO reqDTO);

    /**
     * 查询报价区间（通用）
     *
     * @param id
     * @return
     */
    List<CompanyUserQuotationInvervalDTO> listQuotationInterval(Long id);

    /**
     * 查询用户报价区间（通用）
     * @param userIdList
     * @return
     */
    Map<Long,List<CompanyUserQuotationInvervalDTO>> queryUserQuotationIntervalMap(List<Long> userIdList);

    /**
     * 根据公司ID集合查询用户（更新公司用户索引使用）
     *
     * @param companyIds
     * @return
     */
    List<CompanyUserIndexRspDTO> listByCompanyIds(List<Long> companyIds);

    /**
     * 查询用户的有效邮箱（发邮件用）
     *
     * @param notifyBitmap 通知Bitmap（即业务类型）
     * @param ids
     * @return
     */
    List<CompanyUserKeyFieldRspDTO> listValidEmailByIds(Integer notifyBitmap, List<Long> ids);

    /**
     * 修改用户和公司的客户/供应商身份（通用）
     *
     * @param reqDTO
     */
    void updateIsSupplierCustomer(CompanyUserUpdateIsSupplierCustomerReqDTO reqDTO);

    /**
     * 认证用户
     *
     * @param reqDTO
     * @return
     */
    CompanyUserKeyFieldRspDTO authentication(CompanyUserLoginReqDTO reqDTO);

    /**
     * 重置密码
     *
     * @param reqDTO
     */
    void resetPassword(CompanyUserResetPasswordReqDTO reqDTO);

    /**
     * 绑定手机/邮箱
     *
     * @param reqDTO
     */
    void bind(CompanyUserBindReqDTO reqDTO);

    /**
     * 用户注册
     *
     * @param reqDTO
     */
    Long register(CompanyUserRegisterReqDTO reqDTO);

    /**
     * 新用户申请
     *
     * @param reqDTO
     * @return
     */
    CompanyUserNewUserApplyDTO newUserApply(CompanyUserNewUserApplyDTO reqDTO);

    /**
     * 卖家权限申请
     *
     * @param reqDTO
     */
    CompanyUserSupplierApplyDTO supplierApply(CompanyUserSupplierApplyDTO reqDTO);

    /**
     * 修改个人信息
     *
     * @param reqDTO
     */
    void fillData(CompanyUserFillDataReqDTO reqDTO);

    /**
     * 账号信息修改申请
     *
     * @param reqDTO
     * @return
     */
    CompanyUserAccountUpdateApplyDTO accountUpdateApply(CompanyUserAccountUpdateApplyDTO reqDTO);

    /**
     * 根据用户ID更新邮箱
     *
     * @param id    用户ID
     * @param email 邮箱
     * @return 结果
     * @author qiao shengda
     * @since 2021/7/9
     */
    Integer updateEmailById(Long id, String email);

    void updateInvoiceEmailById(Long id, String email);

    /**
     * 通过邮箱获取id
     *
     * @param email 邮箱
     * @return 如果存在，返回ID
     * @author qiao shengda
     * @since 2021/7/11
     */
    Long findIdByEmail(String email);

    /**
     * 查询公司用户
     *
     * @param id     用户ID
     * @param option 包含
     * @return 用户信息
     * @since 2021/8/2
     */
    CompanyUserDTO infoById(Long id, CompanyUserOptionDTO option);

    /**
     * 查询对应公司的用户信息
     *
     * @param queryReqDTO 查询条件
     * @return
     */
    List<CompanyUserListInfoRspDTO> listInfoBy(CompanyUserListInfoQueryReqDTO queryReqDTO);

    /**
     * 通过邮箱获取用户信息
     *
     * @param email 邮箱
     * @return
     */
    CompanyUserKeyFieldRspDTO findByEmail(String email);

    /**
     * 根据手机号/邮箱查询用户
     *
     * @param phoneOrEmail 手机号/邮箱
     * @return 用户
     */
    CompanyUserKeyFieldRspDTO findByPhoneOrEmail(String phoneOrEmail);

    List<Long> selectByIdsWithShareLocked(List<Long> ids);

    /**
     * 重新认证通过
     * @param id
     * @param operatorReqDTO
     */
    void reVerified(Long id, OperatorReqDTO operatorReqDTO);
}
